<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>03计算属性实现</title>
  <script src="../js/vue.js"></script>
</head>
<body>
  <div id="app">
    <h1>{{title}}</h1>
    姓：<input type="text" v-model="firstName">
    <br>
    名：<input type="text" v-model="lastName">
    <br>
    全名：<span>{{fullName}}</span>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data() {
        return {
          title: '计算属性实现',
          firstName: 'zhang',
          lastName: 'san'
        }
      },
      /* 
        计算属性
          1 定义：要用的属性不存在，通过已有的属性计算得来
          2 原理：借助defineProperty的getter和setter实现
          3 getter什么时候执行？
            初次读取会执行一次
            当计算属性所依赖的数据变化时才会再次执行
          4 修改计算属性必须通过书写setter响应修改，且在setter中要引起计算属性所依赖的数据发生改变
          5 计算属性最终也会出现在vm身上，在模板中直接使用即可

        计算属性和methods对比：
          计算属性有缓存机制，效率高
      */
      computed: {
        fullName: {
          get() {
            return this.firstName + '-' + this.lastName
          },
          set(val) {
            this.firstName = val.split('-')[0]
            this.lastName = val.split('-')[1]
          }
        }
      }
    })
  </script>
</body>
</html>